from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import SecretStr

from settings import DASHSCOPE_API_KEY

# 1-定义客户端
llm = ChatOpenAI(
    model="qwen-max",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=SecretStr(DASHSCOPE_API_KEY),
    streaming=True
)

# 2-定义对话上下文
messages = [
    {"role": "system", "content": "你是一位{role}专家，擅长回答{domain}领域的问题"},
    {"role": "user", "content": "用户问题：{question}"},
]

# 3-创建一个ChatPromptTemplate
chat_prompt_template = ChatPromptTemplate.from_messages(messages)

# 3.1-参数注入1-失败（不要直接用 SystemMessage(content="...{var}")，那样变量不会被解析。）
chat_prompt_detail1 = chat_prompt_template.format_messages(
    role="Python",
    domain="编程",
    question="如何编写一个闹钟程序?")
print("----chat_prompt_detail1:", chat_prompt_detail1)

# 3.2-参数注入2-失败（不要直接用 SystemMessage(content="...{var}")，那样变量不会被解析。）
chat_prompt_detail2 = chat_prompt_template.invoke({
    "role": "Python",
    "domain": "编程",
    "question": "如何编写一个闹钟程序"})
print("----chat_prompt_detail2:", chat_prompt_detail2)

# 3.3-参数注入3-失败（不要直接用 SystemMessage(content="...{var}")，那样变量不会被解析。）
chat_prompt_partial = chat_prompt_template.partial(
    role="Python",
    domain="编程",
    question="如何编写一个闹钟程序?").invoke({})
# .partial() 返回的仍是 ChatPromptTemplate，不能直接喂给 llm.stream()；需要再 .invoke() 一次，把模板渲染成真正的消息列表。
chat_prompt_detail3 = (chat_prompt_partial).messages
print("----chat_prompt_detail3:", chat_prompt_detail3)

# 5-打印响应结果
print("-----Hold on, LLM 正在回答！-----")
response = llm.stream(chat_prompt_detail3)
for chunk in response:
    # 打印不换行
    print(chunk.content, end="")
